package com.fxu.framework.core.sql;

import lombok.Getter;
import lombok.ToString;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * 所有查询条件 中子查询类（主要支持单表单or）
 *
 * @author 方旭
 * @version 1.0.0
 */
@Getter
@ToString
public class SChild<SE extends SEntity<?>> implements SCompare<SChild<SE>, SE> {

    /**
     * 实体类的类
     */
    protected Class<SE> clazz;

    /**
     * 查询条件(会判断是否存在)
     */
    private final List<SValue> queryList = new ArrayList<>();

    /**
     * 创建SChild对象
     * @param <SE> SEntity对象类型
     * @param clazz SEntity类型对象
     * @return SChild 对象
     */
    public static <SE extends SEntity<?>> SChild<SE> build(Class<SE> clazz) {
        return new SChild<>(clazz);
    }

    /**
     * 构造方法,设置实体类
     * @param clazz 实体类
     */
    public SChild(Class<SE> clazz) {
        this.clazz = clazz;
    }

    /**
     * 构造方法,设置实体类
     */
    @SuppressWarnings("unchecked")
    public SChild() {
        Type type = getClass().getGenericSuperclass();
        if (type instanceof ParameterizedType) {
            this.clazz = (Class<SE>) ((ParameterizedType) type).getActualTypeArguments()[0];
        } else {
            throw new RuntimeException("初始化错误!要么new SChild<T>(){}，要么new SChild<>(Class)");
        }
    }
}
